/*服务端配置信息模块实现*/

#ifndef __MY_CONFIG__
#define __MY_CONFIG__
#include <mutex>
#include "util.hpp"

namespace cloud
{
    #define CONFIG_FILE "./cloud.conf"
    class Config
    {
    private:
        Config(){
            ReadConfigFile();//构造时就要读取配置文件
        }//构造函数私有化
        static Config* _instance;
        static std::mutex _mutex;
    private:
        int _hot_time;
        int _server_port;
        std::string _server_ip;
        std::string _download_prefix;
        std::string _packfile_suffix;
        std::string _pack_dir;
        std::string _back_dir;
        std::string _backup_file;

        //读取配置文件
        bool ReadConfigFile()
        {
            FileUtil fu(CONFIG_FILE);
            //读取配置文件信息到body中
            std::string body;
            if(fu.GetContent(&body) == false)
            {
                std::cout << "load config file failed!\n";
                return false;
            }
            //将body内容反序列化到Json::Value对象
            Json::Value root;
            if(JsonUtil::UnSerialize(body,&root) == false)
            {
                std::cout << "parse config file failed!\n";
                return false;
            }
            _hot_time = root["hot_time"].asInt();
			_server_port = root["server_port"].asInt();
			_server_ip = root["server_ip"].asString();
			_download_prefix = root["download_prefix"].asString();
			_packfile_suffix = root["packfile_suffix"].asString();
			_pack_dir = root["pack_dir"].asString();
			_back_dir = root["back_dir"].asString();
			_backup_file = root["backup_file"].asString();
            return true;
        }
    public:
        static Config* GetInstance()
        {
            if(_instance == NULL)
            {
                _mutex.lock();
                if(_instance == NULL)
                {
                    _instance = new Config();
                }
                _mutex.unlock();
            }
            return _instance;
        }
        int GetHotTime()
        {
            return _hot_time;
        }
        int GetServerPort()
        {
            return _server_port;
        }
        std::string GetServerIp()
        {
            return _server_ip;
        }
        std::string GetDownloadPrefix()
        {
            return _download_prefix;
        }
        std::string GetPackFileSuffix()
        {
            return _packfile_suffix;
        }
        std::string GetPackDir()
        {
            return _pack_dir;
        }
        std::string GetBackDir()
        {
            return _back_dir;
        }
        std::string GetBackupFile()
        {
            return _backup_file;
        }
    };
    //静态成员变量在类外定义
    Config* Config::_instance = NULL;
    std::mutex Config::_mutex;
}

#endif
